package com.jenxsol.custom.listview.frags; import java.util.ArrayList; import java.util.List; import android.os.Bundle; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.TextView; import com.jenxsol.custom.listview.R; import com.mobeta.android.dslv.DragSortController; import com.mobeta.android.dslv.DragSortListView; import com.mobeta.android.dslv.DragSortListView.DropListener; import com.mobeta.android.dslv.DragSortListView.RemoveListener; public class CustomListViewFragment extends Fragment { private static final String[] initStrings = new String[] { "1. one", "2. two", "3. three", "4. four", "5. five", "6. six", "7. seven", "8. eight", "9. nine", "10. ten" }; private static int mNumberCount = 10; private final List<String> mStrings = new ArrayList<String>(mNumberCount); private DragSortListView mListView; private DragAdapter mAdapter; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setHasOptionsMenu(true); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment_listview, container, false); } @Override public void onViewCreated(View v, Bundle savedInstanceState) { super.onViewCreated(v, savedInstanceState); mListView = (DragSortListView) v.findViewById(android.R.id.list); mAdapter = new DragAdapter(mStrings); mListView.setAdapter(mAdapter); buildController(mListView); } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { super.onCreateOptionsMenu(menu, inflater); inflater.inflate(R.menu.activity_main, menu); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); initData(); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.menu_add: mNumberCount++; final String newNumber = mNumberCount + ". " + EnglishNumberToWords.convert(mNumberCount); mAdapter.addItem(newNumber); break; default: break; } return super.onOptionsItemSelected(item); } /** * Set up the list view with the controller and defined controls * * @param dslv * @return */ private DragSortController buildController(DragSortListView dslv) { // defaults are // dragStartMode = onDown // removeMode = flingRight DragSortController dragCon = new DragSortController(dslv); dragCon.setDragHandleId(R.id.list_drag_handle); dragCon.setDragInitMode(DragSortController.ON_DRAG); dragCon.setRemoveEnabled(true); dragCon.setRemoveMode(DragSortController.FLING_LEFT_REMOVE); dragCon.setSortEnabled(true); dragCon.setBackgroundColor(getResources().getColor(android.R.color.holo_blue_light)); // Next two are important!! dslv.setFloatViewManager(dragCon); dslv.setOnTouchListener(dragCon); // dslv.setDragEnabled(true); dslv.setDropListener(onDropListener); dslv.setRemoveListener(onRemoveListener); return dragCon; } private void initData() { for (String s : initStrings) { addRow(s); } } private void addRow(String newString) { mAdapter.addItem(newString); } /** * What happens when you drop the item */ private DragSortListView.DropListener onDropListener = new DropListener() { @Override public void drop(int from, int to) { final String removed = mAdapter.removeItemAt(from); mAdapter.addItemAt(removed, to); } }; /** * Fired when the item is removed from the list view */ private DragSortListView.RemoveListener onRemoveListener = new RemoveListener() { @Override public void remove(int which) { mAdapter.removeItemAt(which); } }; /** * Standard custom adapter for the list view * * @author chris * */ private class DragAdapter extends BaseAdapter { private final List<String> mData; private final LayoutInflater mInflater; public DragAdapter(List<String> data) { if (data == null) mData = new ArrayList<String>(0); else mData = data; mInflater = LayoutInflater.from(getActivity()); } public void addItem(String text) { mData.add(text); notifyDataSetChanged(); } public void addItemAt(String text, int pos) { mData.add(pos, text); notifyDataSetChanged(); } public String removeItemAt(int position) { final String removed = mData.remove(position); notifyDataSetChanged(); return removed; } @Override public int getCount() { return mData.size(); } @Override public Object getItem(int position) { return mData.get(position); } @Override public long getItemId(int position) { return 0; } @Override public View getView(int position, View convertView, ViewGroup parent) { final View v; if (convertView == null) { v = mInflater.inflate(R.layout.element_draggable_listitem, parent, false); } else { v = convertView; } final TextView tv = (TextView) v.findViewById(android.R.id.text1); tv.setText(mData.get(position)); return v; } } }